package com.ts.comm;

import com.ts.jdbc.SysDB;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 通用结果返回类
 * Created by xhc on 2017-3-22.
 */
public class SysResult {

    //分页大小
    private int pageSize;
    //当前页
    private int pageNumber;

    //总记录数
    private int total;
    //结果集
    private List<?> rows;
    //单行结果集
    private Map<String,Object> maprow;
    //错误信息
    private String msg;
    //错误明细信息
    private String detailMsg;
    //预留
    private Object objOther;

    public Object getObjOther() {
        return objOther;
    }

    public void setObjOther(Object objOther) {
        this.objOther = objOther;
    }



    public SysResult(){

    }

    /**
     * 分页使用
     * @param jdbcTemplate 命名参数（NamedParameterJdbcTemplate）
     * @param sql 无分页sql语句
     * @param map sql命名参数
     * @param iPageSize 分页每页大小
     * @param iPageNumber 当前第几页
     */
    private static  int iTotal=0;
    public SysResult(NamedParameterJdbcTemplate jdbcTemplate, String sql, HashMap<String,Object> map, int iPageSize, int iPageNumber) {
        try {
            this.setPageSize(iPageSize);
            this.setPageNumber(iPageNumber);
            this.setRows(SysDB.getRows(jdbcTemplate,sql,iPageNumber,iPageSize,map));
            if(this.getRows()!=null && !this.getRows().isEmpty()){
                this.setMaprow((Map<String, Object>) this.getRows().get(0));
            }
            if (iPageNumber <= 1 && iPageSize > 0) {
                iTotal=SysDB.getIntValue(jdbcTemplate, "select count(1) from (" + sql + ")", map);
                this.setTotal(iTotal);
            }else if(iPageSize==0){
                this.setTotal(getRows().size());
            }else{
                this.setTotal(iTotal);
            }

        } catch (Exception e) {
            onSetErrorMsg(e);
        }
    }
    /**
     * 正常使用
     * @param jdbcTemplate 命名参数（NamedParameterJdbcTemplate :code 形式）
     * @param sql sql语句
     * @param map sql命名参数
     */
    public SysResult(NamedParameterJdbcTemplate jdbcTemplate, String sql, HashMap<String,Object> map) {
        try {
            this.setRows(SysDB.getRows(jdbcTemplate,sql,map));
            if(this.getRows()!=null && !this.getRows().isEmpty()){
                this.setMaprow((Map<String, Object>) this.getRows().get(0));
            }
            this.setTotal(getRows().size());

        } catch (Exception e) {
            onSetErrorMsg(e);
        }
    }
    /**
     * 正常使用
     * @param jdbcTemplate 命名参数（NamedParameterJdbcTemplate :code 形式）
     * @param sql sql语句
     */
    public SysResult(NamedParameterJdbcTemplate jdbcTemplate, String sql) {
        try {
            this.setRows(SysDB.getRows(jdbcTemplate,sql));
            if(this.getRows()!=null && !this.getRows().isEmpty()){
                this.setMaprow((Map<String, Object>) this.getRows().get(0));
            }
            this.setTotal(getRows().size());

        } catch (Exception e) {
            onSetErrorMsg(e);
        }
    }

    /**
     * 分页使用
     * @param jdbcTemplate 命名参数（JdbcTemplate ？形式）
     * @param sql 无分页sql语句
     * @param args sql命名参数
     * @param iPageSize 分页每页大小
     * @param iPageNumber 当前第几页
     */
    public SysResult(JdbcTemplate jdbcTemplate, String sql, int iPageSize, int iPageNumber,Object...args) {
        try {
            this.setPageSize(iPageSize);
            this.setPageNumber(iPageNumber);
            this.setRows(SysDB.getRows(jdbcTemplate,sql,iPageNumber,iPageSize,args));
            if(this.getRows()!=null && !this.getRows().isEmpty()){
                this.setMaprow((Map<String, Object>) this.getRows().get(0));
            }
            if (iPageNumber <= 1 && iPageSize > 0) {
                iTotal=SysDB.getIntValue(jdbcTemplate, "select count(1) from (" + sql + ")", args);
                this.setTotal(iTotal);
            }else if(iPageSize==0){
                this.setTotal(getRows().size());
            }else{
                this.setTotal(iTotal);
            }

        } catch (Exception e) {
            onSetErrorMsg(e);
        }
    }
    /**错误信息推送到前台
     * @param e
     */
    public void onSetErrorMsg(Exception e)
    {
        if (SysString.isEmpty(e.getLocalizedMessage()))
        {
            this.setMsg("未知错误！\n" + e.getStackTrace().toString());
        }
        else
        {
            this.setMsg(e.getLocalizedMessage());
        }
        StringWriter sw = new StringWriter();
        e.printStackTrace(new PrintWriter(sw));
        this.setDetailMsg(sw.toString());
        throw new RuntimeException(this.getMsg());
    }

    public Map<String, Object> getMaprow() {
        return maprow;
    }

    public void setMaprow(Map<String, Object> maprow) {
        this.maprow = maprow;
    }

    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    public int getPageNumber() {
        return pageNumber;
    }

    public void setPageNumber(int pageNumber) {
        this.pageNumber = pageNumber;
    }

    public int getTotal() {
        return total;
    }

    public void setTotal(int totalCount) {
        this.total = totalCount;
    }

    public List<?> getRows() {
        return rows;
    }

    public void setRows(List<?> rows) {
        this.rows = rows;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String getDetailMsg() {
        return detailMsg;
    }

    public void setDetailMsg(String detailMsg) {
        this.detailMsg = detailMsg;
    }
}
